#include "devices/input.h"
#include <debug.h>
#include "devices/intq.h"
#include "devices/serial.h"

/* Stores keys from the keyboard and serial port. */
static struct intq buffer;

/* Initializes the input buffer. */
void input_init(void)
{
    intq_init(&buffer);
}

/* Adds a key to the input buffer.
   Interrupts must be off and the buffer must not be full. */
void input_putc(uint8_t key)
{
    ASSERT(intr_get_level() == INTR_OFF);
    ASSERT(!intq_full(&buffer));

    intq_putc(&buffer, key);
    serial_notify();
}

/* Retrieves a key from the input buffer.
   If the buffer is empty, waits for a key to be pressed. */
uint8_t input_getc(void)
{
    enum intr_level old_level;
    uint8_t key;

    old_level = intr_disable();
    key = intq_getc(&buffer);
    serial_notify();
    intr_set_level(old_level);

    return key;
}

/* Returns true if the input buffer is full,
   false otherwise.
   Interrupts must be off. */
bool input_full(void)
{
    ASSERT(intr_get_level() == INTR_OFF);
    return intq_full(&buffer);
}
